﻿//using System.Collections;
//using System.Collections.Generic;
//using System;
//using UnityEngine;

//namespace MFramework
//{
//    internal class AudioChannel : MonoBehaviour
//    {
//        public ChannelType channelType;
//        public Sound sound;

//        private float m_volumeFact = 1.0f;
//        private float m_originVolume;
//        private AudioSource m_source;

//        private uint m_fadeTimerID;
//        private bool m_isFading;

//        private void Awake()
//        {
//            m_source = gameObject.AddComponent<AudioSource>();
//        }

//        public void Play(Sound _sound, bool loop, bool fadeIn)
//        {
//            this.sound = _sound;
//            m_source.clip = _sound.clip;
//            m_source.loop = loop;
//            m_source.time = _sound.timeline;
//            m_originVolume = _sound.volume;

//            m_source.Play();

//            if (fadeIn)
//            {
//                if (m_isFading)
//                    StopFading();

//                m_volumeFact = 0;
//                UpdateVolume();

//                m_isFading = true;

//                void action() { m_volumeFact += 0.02f; UpdateVolume(); }
//                void callback() { m_isFading = false; }

//                m_fadeTimerID = Timer.Inst.Regist(action, 0, 10, 500, callback);
//            }
//        }

//        public void Stop(bool fadeOut)
//        {
//            if (fadeOut)
//            {
//                if (m_isFading)
//                    StopFading();

//                m_isFading = true;

//                void action() { m_volumeFact -= 0.02f; UpdateVolume(); }
//                void callback() { m_isFading = false; m_source.Stop(); sound = null; }

//                m_fadeTimerID = Timer.Inst.Regist(action, 0, 10, 500, callback);
//            }
//            else
//            {
//                m_source.Stop(); sound = null;
//            }
//        }

//        public bool IsPlaying()
//        {
//            return m_source.isPlaying;
//        }

//        public bool IsIdle()
//        {
//            return sound == null;
//        }

//        public void UpdateVolume()
//        {
//            if (channelType == ChannelType.Music)
//                m_source.volume = m_originVolume * m_volumeFact * AudioManager.Inst.GlobalMusicVolume;
//            else if (channelType == ChannelType.SoundEx)
//                m_source.volume = m_originVolume * m_volumeFact * AudioManager.Inst.GlobalSoundVolume;
//        }

//        /*
//         * Mgr的Pause和Stop都会主动调channel的Stop，将sound置空
//         * 所以当sound!=null且处于非Playing状态说明音频自动播放完成，需要Stop释放
//         */
//        public void UpdateTimeline()
//        {
//            if (IsPlaying() && !IsIdle())
//            {
//                sound.timeline = m_source.time;
//            }
//        }

//        public void SetVolume(float volume)
//        {
//            if(IsPlaying() && !IsIdle())
//            {
//                m_originVolume = volume;
//                UpdateVolume();
//            }
//        }

//        public void SetTimeline(float timeline)
//        {
//            m_source.time = timeline;
//        }

//        private void StopFading()
//        {
//            Timer.Inst.UnRegist(m_fadeTimerID);

//            m_isFading = false;
//        }

//        public enum ChannelType
//        {
//            Music, SoundEx
//        }
//    }
//}